這次的任務是為專案省成本,根據 AWS 官方建議,其中之一就是 Down scaling,也就是在閒暇時間將機器關閉。我們專案剛好有 dev,stage,beta,prod 四個環境,且開發並沒有如此頻繁,dev,stage等環境一般時間開著也是燒錢,不如就來想辦法”自動化”關掉它們!
如果你是 EC2-based 的架構,你可以很快速的使用 Scheduled Scaling for Auto Scaling Groups。
但如果你是 EKS,相較於 EC2 一次只跑一個 setup,EKS 上一個 ec2 會跑多個 container,也就是説直接開關並不是一個可行的方式,因為以下原因
因此,我們會藉由調整 MNG 的 ASG 來達到需求
eksctl get nodegroup --cluster my-eks
CLUSTER NODEGROUP STATUS CREATED MIN SIZEMAX SIZE DESIRED CAPACITY INSTANCE TYPE IMAGE ID ASG NAME TYPE
my-eks general-2023092014043003710000000a ACTIVE 2023-09-20T14:04:33Z 1 10 1 t3.small AL2_x86_64 eks-general-2023092014043003710000000a-06c55974-0d19-b192-0640-bc9ae7f7868d managed
my-eks spot-2023092014043003760000000c ACTIVE 2023-09-20T14:04:34Z 1 10 1 t3.micro AL2_x86_64 eks-spot-2023092014043003760000000c-cac55974-0d35-8a03-eb66-5bc3160c9311 managed
一般狀況下, cluster autoscaler 不會發現 ASG 沒被管理的 node groups。所以你必須新增 tags 到 AGS 來檢測 ASG 及部署 cluster autoscaler
export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='kubernetes.io/cluster/my-eks') &&
Value=='owned']].[AutoScalingGroupName]")
為此 asg 加上 tag
aws autoscaling create-or-update-tags \
--tags
ResourceId=${ASG_NAME},ResourceType=auto-scaling-group,
Key=k8s.io/cluster-autoscaler/scale-to-from-zero,Value=owned,PropagateAtLaunch=true
aws autoscaling create-or-update-tags \
--tags
ResourceId=${ASG_NAME},ResourceType=auto-scaling-group,
Key=k8s.io/cluster-autoscaler/enabled,Value=true,PropagateAtLaunch=true
eksctl scale nodegroup --cluster=<clusterName> --nodes=<desiredCount>
--name=<nodegroupName> [ --nodes-min=<0> ] [ --nodes-max=<1> ]
eksctl scale nodegroup --cluster=my-eks --nodes=0 --name=<nodegroupName>
#!/bin/bash
# 藉由 eksctl 獲取 JSON 格式的 Nodegroup Name
NODEGROUP_NAME=$(eksctl get nodegroup --cluster my-eks -o json)
# 將 formatted_NG_NAME 轉換成 list
formatted_NG_NAME=()
while IFS= read -r line; do
formatted_NG_NAME+=("$line")
done <<< "$formatted_NG_NAME_str"
# 遍尋 formatted_ASG_NAME list,並執行 MNG ASG 設定
for NODEGROUP in $formatted_NG_NAME; do
echo $NODEGROUP
eksctl scale nodegroup --cluster=my-eks --name="$NODEGROUP" --nodes-min=0 --nodes=0
eksctl scale nodegroup --cluster=my-eks --nodes=0 --name="$NODEGROUP"
done
###############
#!/bin/bash
# 藉由 eksctl 獲取 JSON 格式的 Nodegroup Name
NODEGROUP_NAME=$(eksctl get nodegroup --cluster my-eks -o json)
# 將 formatted_NG_NAME 轉換成 list
formatted_NG_NAME=()
while IFS= read -r line; do
formatted_NG_NAME+=("$line")
done <<< "$formatted_NG_NAME_str"
# 遍尋 formatted_ASG_NAME list,並執行 MNG ASG 設定
for NODEGROUP in $formatted_NG_NAME; do
echo $NODEGROUP
eksctl scale nodegroup --cluster=my-eks --name="$NODEGROUP" --nodes-min=0 --nodes=1
eksctl scale nodegroup --cluster=my-eks --nodes=1 --name="$NODEGROUP"
done